package com.mc.mcgoweb.utils.encrypt.rsaencrypt;

import com.mc.common.base.BaseResponse;
import com.mc.common.base.ResultUtil;
import com.alibaba.fastjson.JSONObject;
import com.mc.mcgoweb.utils.JsonUtil;
import com.mc.mcgoweb.vo.Student;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class DemoController {
    /**
     * 非对称性加密原理
     * 使用工具生成一对公钥和私钥PUBLIC_KEY和PRIVATE_KEY
     * PRIVATE_KEY服务器自己来保存,公钥发送给请求方,请求方使用公钥+请求参数生成一串加密后的参数字符串str
     * 加密字符串str传递给后台(本实例通过postman传递格式为：
     * {"requestData":"OR7oROxBsQL5dGrd2WRb1vAB2D6jks2a77+TZ65uPhMDj4swkjAZ0gILWp1sWfyeyXLzJj3lFXgKEgI81mvkS33qTmLO+V1/sDk4LxS9VfW71p5EgbUn//l6xgNAMXhspJvCX/Rlmm9lR6WXKYMfpFMFXf0rLnNvpuEcqYWwqp8="})
     * 后台如何通过加密的字符串解析成为参数呢 使用AOP？使用拦截器?过滤器？
     * 这三个都不能实现，因为他们过来的参数都是一串字符串，没办法动态的把字符串映射到参数VO上面去，
     * 最后技术选择：RequestBodyAdvice，ResponseBodyAdvice
     * 使用@ControllerAdvice注解+ResponseBodyAdvice+ResponseBodyAdvice，可以对请求的输入输出进行处理，避免了在controller中对业务代码侵入。
     * 使用方法：https://blog.csdn.net/pongandnoon/article/details/84555414
     *
     *
     *
     */
    private String PUBLIC_KEY = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDUFt8Qyl4hHlOOHJRqX22MauDF" +
            "K0OX6UUnqqeEe3QddmGfhdHxDTFHgZc+LhEqnrn6lUJIWi8CEDJ5ir5HsS2/pq+1" +
            "Ax59HIjJlEtTt+bjt6TCZzNcZ3hMsz/etbSJrycQF73gLPW5H+0O+pa+exve6n1b" +
            "ZVfOloGDH73SFZBLAwIDAQAB";

    @GetMapping("/rsa")
    public BaseResponse test(Student demoVo) {
        //模拟前端加密
        return ResultUtil.getSuccessResultData(RSAUtils.encryptedDataOnJava(JsonUtil.toJson(demoVo), this.PUBLIC_KEY));
    }

    @RsaSecurityParameter
    @PostMapping("/rsa2")
    public String test2(@RequestBody Student demoVo) {
        System.out.println(demoVo.getName());
        return JSONObject.toJSONString(demoVo);
    }
}
